Welcome to EOELAB!

EOELAB 权限模型

EOELAB 权限模型

本文档集中说明 EOELAB 各设施的权限等级、继承关系和安全边界,供权限设计、授权审查和故障排查使用。设施部署配置参见《EOELAB 运维手册》,用户操作参见《EOELAB 用户手册》。

Zitadel

Zitadel 提供统一身份认证。默认账户位于 FEDERATION Organization;有效用户账户即代表 EOELAB 成员身份。Project 用于组织应用和管理角色。

管理级别

级别用途典型授权
Project管理应用及其管理角色本地域维护者按需获得 Org User Permission Editor,用于维护应用角色
Organization管理自定义域名、Project 和独立用户体系新增独立 Organization 时向负责人授予 Org Owner

普通成员不通过 Project 角色分级。应用需要区分资源所有权或管理能力时,继续使用自身的安全边界:Incus 资源权限由 OpenFGA 决定,Headplane 网络管理权限由 Headplane 角色决定,RustFS 数据权限由 Policy 决定。

默认分配

身份默认授权
普通成员有效 Zitadel 账户即获得成员身份
本地域维护者普通成员身份;按实际职责增加对应应用或 Project 的管理权限
独立 Organization 负责人对应 Organization 的 Org Owner

维护者同时也是普通成员,但维护者身份本身不自动获得应用管理权限。所有管理权限均应与实际职责对应。

Headplane

Headplane 控制用户在联邦网络管理界面中的能力,访问地址参见《EOELAB 服务端点》。

权限能力限制
Admin查看管理界面;管理网络、节点和用户设置无
Network Admin查看管理界面;管理 ACL 和网络设置不能全局管理节点或用户
IT Admin查看管理界面;管理节点和用户不能管理 ACL 或网络设置
Auditor只读查看管理界面;生成自己的 auth key不能执行全局管理操作
Viewer查看节点和用户;生成自己的 auth key;管理自己的节点不能管理网络、用户或其他用户的节点
Member无管理界面权限不能进入管理界面

普通用户默认分配 Viewer。提升为 Auditor、IT Admin、Network Admin 或 Admin 必须与实际维护职责对应。

RustFS

RustFS 使用 OIDC 用户身份和 Service Account 提供对象存储访问。普通用户共享同一份 user Policy,通过 Zitadel sub 动态限定资源,不为每位用户单独创建 IAM User、Policy 或 Role。

普通用户不得获得全局 s3:ListAllMyBuckets。Bucket 列表由 RustFS 根据用户对每个 Bucket 的 s3:ListBucket 或 s3:GetBucketLocation 权限过滤,只返回 <sub> 和 <sub>-* 范围内的 Bucket;否则会暴露其他用户的 Bucket 名称。

身份能力边界
系统管理员管理 RustFS、IAM、所有 Bucket 和系统配置仅限对象存储维护者
OIDC 用户管理自己的 Bucket、对象、S3 Tables,并创建或更新自己的 Service Account仅限 <sub> 和 <sub>-* Bucket
Service Account通过 S3 或 WebDAV 执行非交互式访问有效权限是父 OIDC 用户权限与自身附加策略的交集,不能突破父级边界

共享 user Policy 不授予以下全局 IAM 管理权限:

admin:CreateUser
admin:CreatePolicy
admin:AttachUserOrGroupPolicy
admin:ListServiceAccounts
admin:RemoveServiceAccount
admin:*
s3:ListAllMyBuckets

Service Account 的 Access Key 和 Secret Key 是独立长期凭证。WebDAV 只接受这类 Basic Auth 凭证,不使用无法携带 Session Token 的 OIDC/STS 临时凭证。

Incus + OpenFGA

Incus 使用 OpenFGA 实现基于关系的访问控制(ReBAC)。Incus 和 OpenFGA 的部署配置参见《EOELAB 运维手册》。

授权方式

Incus 使用 OpenFGA 实现基于关系的访问控制(ReBAC)。它不是传统的“角色对应固定菜单”,而是由 Incus 针对每次 API 请求检查:

用户或组 + entitlement + Incus 对象 = 是否允许

例如,为 user:alice 建立 project:dev 的 operator 关系后,Alice 会通过继承获得 dev 项目内资源的操作权限。Incus 实际检查的是 can_view、can_edit、can_exec 等 entitlement,admin、operator、user、viewer 是 entitlement 的权限包。

关系元组使用 OpenFGA 的 user / relation / object 三元组:

userrelationobject含义
user:aliceoperatorproject:devAlice 是 dev 项目的操作员
group:ops#memberoperatorproject:devops 组成员是 dev 项目的操作员
user:alicecan_execinstance:dev/web01Alice 只能获得 web01 的命令执行能力

关系元组的增删和查询在 fgaplane 中完成,访问地址参见《EOELAB 服务端点》。

对象格式

所有对象均使用 <类型>:<标识符> 格式。项目级对象的标识符以项目名开头,不是单独的 project/instance_name 参数。

对象格式示例
Serverserver:incus
Projectproject:dev
Certificatecertificate:<完整指纹>
Storage Poolstorage_pool:local
Network Integrationnetwork_integration:ovn
Instanceinstance:dev/web01
Imageimage:dev/<完整指纹>
Image Aliasimage_alias:dev/debian
Networknetwork:dev/br0
Network ACLnetwork_acl:dev/web
Network Address Setnetwork_address_set:dev/internal
Network Zonenetwork_zone:dev/example.net
Profileprofile:dev/default
Storage Bucketstorage_bucket:dev/local/archive[/location]
Storage Volumestorage_volume:dev/local/custom/data[/location]

server、project 和 shared_with 是 Incus 维护资源归属关系时使用的结构关系,不应作为普通用户权限手动修改。

模型规则

  1. 权限只做并集,没有 deny。用户通过任意一条关系路径获得 entitlement 后,不能在子对象上用另一条元组拒绝。
  2. 父级角色向下生效。Server 角色影响所有 Project,Project 角色影响该项目的资源和 Instance。
  3. 创建资源不会让创建者自动成为 owner。模型中没有 owner 关系,单独的 can_create_* 不保证创建后还能查看或管理资源。
  4. can_edit 通常包含修改、重命名和删除,不是无破坏性的“编辑配置”。
  5. 单独授予 can_exec、can_update_state 等专项 entitlement 不会自动获得 can_view。CLI 可能会先查询对象,因此最小权限通常还要搭配 viewer。
  6. 一个 CLI 命令可能访问多个对象。例如创建实例通常还需要查看源镜像以及所用 Profile、Network;复制和移动还会分别检查源、目标对象。
  7. 模型中包含 [user, group#member] 的 relation 可以直接授予用户或组;只有 operator、viewer from project 等计算表达式的 relation 只能通过角色或继承获得。

模型表达式示例:

define can_edit: [user, group#member] or operator from project

表示可以把 can_edit 直接授予用户或组,也可以由资源所属 Project 的 operator 自动获得。

默认权限

Incus 初始化模型时会加入:

server:incus#authenticated@user:*

所以每个已经通过认证的用户即使没有任何业务角色,仍然拥有:

因此“没有分配角色”不等于完全没有可见信息。

角色继承

三个作用域中的角色均按以下顺序包含右侧角色:

admin -> operator -> user -> viewer

Server 的同名角色会传递给所有 Project,Project 的同名角色会传递给其所有 Instance。

作用域角色实际能力
Serverviewer查看所有项目及其资源、证书、网络集成和完整 Server config
Serveruserviewer + 所有项目的 user,可进入所有实例并访问其数据面
Serveroperatoruser + 所有项目的 operator,可创建、修改、删除所有项目资源
Serveradmin完整服务器和集群管理、全局资源创建,并成为所有项目的 admin
Projectviewer查看该项目及其所有资源
Projectuserviewer + 查看项目 events/operations + 项目内所有实例的 user
Projectoperatoruser + 创建、修改、删除项目资源 + 项目内所有实例的 operator
Projectadminoperator + 修改、重命名、删除项目本身及其限制配置
Instanceviewer查看一个实例的配置、状态、日志、快照和备份信息
Instanceuserviewer + console、exec、文件、SFTP、NBD 和 TCP 转发
Instanceoperatoruser + 编辑、删除、启停、重建以及管理快照和备份
Instanceadmin当前模型中实际能力与 operator 相同,没有额外 entitlement

需要特别注意:

Server Entitlement

Entitlement允许的操作
can_view查看基本服务器信息、集群状态、成员和集群组
can_view_sensitive查看完整 Server config
can_view_resources查看宿主机资源、Storage Pool resources 和非托管网卡
can_view_metrics访问 metrics;返回的实例指标继续按 Instance can_view 过滤
can_view_privileged_events查看 logging 类型的特权事件
can_edit修改服务器配置,管理集群、成员、集群组、warnings 和内部管理接口
can_create_certificates添加信任证书
can_create_projects创建 Project
can_create_storage_pools创建 Storage Pool
can_create_network_integrations创建 Network Integration
can_override_cluster_target_restrictionProject 禁止指定 Cluster target 时仍允许指定成员

Project Entitlement

Entitlement允许的操作
can_view查看 Project 和 Project state
can_edit修改限制和配置、重命名、删除 Project,以及查看 Project access
can_create_instances创建实例、复制到该项目、从备份导入实例
can_create_images导入镜像或从实例发布镜像
can_create_image_aliases创建 Image Alias
can_create_profiles创建 Profile
can_create_networks创建 Network
can_create_network_acls创建 Network ACL
can_create_network_address_sets创建 Network Address Set
can_create_network_zones创建 Network Zone
can_create_storage_volumes创建、复制或导入 Storage Volume
can_create_storage_buckets创建 Storage Bucket
can_view_events查看该项目的 operation、lifecycle 和 network-acl events;不包含 logging
can_view_operations列出该项目的异步 operations

Instance Entitlement

Entitlement允许的操作
can_viewlist/show/info/state,读取日志、metadata、NVRAM、快照和备份信息
can_edit修改配置、rename/move/migrate/delete、rebuild、恢复快照、修改 metadata/NVRAM
can_update_statestart、stop、restart、freeze、unfreeze
can_access_console连接 Instance console;读取 console log 只需要 can_view
can_exec在实例中执行命令,并访问 exec output
can_access_filespull、push、删除实例文件
can_connect_tcp使用 incus port-forward 连接实例端口
can_connect_nbd通过 NBD 访问实例磁盘
can_connect_sftp通过 SFTP 访问实例文件系统
can_manage_snapshots创建、修改、重命名和删除快照;恢复快照仍需要 can_edit
can_manage_backups创建、重命名、删除和导出实例备份

只希望用户在单个实例内执行命令时,建议授予该 Instance 的 viewer 和 can_exec,不要使用会额外开放 console、文件、NBD、SFTP、TCP 的 user。

其他资源 Entitlement

对象can_viewcan_edit 或专项权限
Certificate查看证书信息;只能由 Server viewer 继承修改、替换、删除证书
Image查看和下载/导出镜像;Public Image 不受 OpenFGA 限制修改、删除、refresh、生成 secret
Image Alias查看 Alias修改、重命名、删除
Profile查看配置和设备修改、重命名、删除
Network查看状态、leases、forward、load balancer 和 peer;主 Network config 会被隐藏修改、重命名、删除 Network,并管理其 forward、load balancer 和 peer
Network ACL查看 ACL 规则修改、重命名、删除
Network Address Set查看地址修改、重命名、删除
Network Zone查看 Zone 和 records修改 Zone,并管理 records
Network Integration查看信息;只能由 Server viewer 继承,config 会被隐藏修改、重命名、删除
Storage Pool所有已认证用户均可查看,config/source 会被隐藏修改和删除;不能限定只查看某个 Pool
Storage Volume查看状态、bitmap、快照和备份,并可导出 Volume backup修改、移动、重命名、删除、重建、恢复快照和修改 bitmap
Storage Bucket查看 Bucket、备份和 key;读取 key 时会返回 access key 和 secret key修改 Bucket,并创建、修改、删除 key

Storage Volume 还定义了以下专项 entitlement:

Entitlement允许的操作
can_access_files读取、写入和删除卷内文件
can_connect_nbdNBD 块设备访问
can_connect_sftpSFTP 文件访问
can_manage_snapshots管理 Volume snapshots
can_manage_backups管理 Volume backups

Storage Volume 的 can_edit 会自动包含以上所有专项 entitlement。直接授予某个专项 entitlement 时不会自动得到 can_view。

Incus Storage Bucket 创建的是供应用直接使用的 S3 兼容服务,不是计算设施消费的数据接口,也不等同于联邦原生对象存储设施。应用负责其 Bucket、访问凭证和数据的使用。

子资源权限归属

以下 API 资源没有独立 OpenFGA 对象,复用父对象权限:

子资源权限所属对象
Instance snapshot、backup、log、metadataInstance
Volume snapshot、backup、bitmapStorage Volume
Bucket key、backupStorage Bucket
Network forward、load balancer、peerNetwork
Network Zone recordNetwork Zone
Cluster member、cluster group、warningServer
Events、OperationsProject

Network 是共享资源的特例。Incus 可以使用 shared_with 把 Default Project 的 Network 共享给其他 Project;共享项目的 viewer 只能查看该 Network,不能修改它。

列表和数据读取语义

最小权限选择

需求建议关系
只读一个 Project 的全部资源Project viewer
使用一个 Project 的全部实例,但不能启停或改配置Project user
管理一个 Project 中的资源,但不能修改 Project 限制Project operator
只读一个 InstanceInstance viewer
只在一个 Instance 执行命令Instance viewer + can_exec
只启停一个 InstanceInstance viewer + can_update_state
完整管理一个 InstanceInstance operator
只查看或编辑一个普通资源对支持直接授权的 Image、Network、Profile、Volume 等对象授予 can_view、can_edit 或专项 entitlement

模型没有 deny。如果需要“查看项目中除某实例外的全部资源”,不能先授予 Project viewer 再拒绝该实例,必须逐个授予允许访问的对象。

安全边界

Incus 官方明确要求:不信任其拥有宿主机 root 权限的用户不得授予以下关系:

server: admin
server: operator
server: can_edit
server: can_create_storage_pools
server: can_create_projects
server: can_create_certificates
certificate: can_edit
storage_pool: can_edit
project: admin

其余关系也必须配合严格的 Project restrictions。尤其是 Project operator,如果项目允许特权实例、宿主机磁盘或设备直通,仍可能影响宿主机。

Post list